Файл: GraphEditor.txt

Дата: 10.04.2014

1: * Графический редактор с командами на русском языке.
2: * Программа КОНЦЕПТ, 27.02.2011-11.10.2011, www.gendoc.ru
3: * Используется усеченный словарь словоформ.
4:
5: присвоить ДАННЫЕ_ИЗ_ИНТЕРНЕТ 1
6:
7: функция Применить_правило символ начало конец номер_правила голова_правила хвост_правила
8:   память локальный новый_символ новый_хвост_правила позиция_сцепки новый_конец
9:
10:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
11:
12:   если [хвост_правила] == {}
13:     Добавить_гипотезу [голова_правила] [начало] [конец] [номер_правила]
14:   иначе
15:     список голова новый_символ [хвост_правила]
16:     список хвост новый_хвост_правила [хвост_правила]
17:     вычислить + позиция_сцепки [конец] 1
18:   
19:     факт сопоставить факты_кандидаты "r;<гипотеза>;[новый_символ];[позиция_сцепки];[?];[?]"
20:     для [факты_кандидаты]    
21:       список взять новый_конец (факт взять $результат [$ОбъектЦикла] ) 5
22:       Применить_правило [новый_символ] [начало] [новый_конец] [номер_правила] [голова_правила] [новый_хвост_правила]
23:     следующий  
24:   конец        
25: возврат
26:
27: * добавление новой гипотезы, если такой еще нет
28: * устанавливает переменную: ПРАВИЛО_ПРИМЕНЕНО
29: функция Добавить_гипотезу символ начало конец номер_правила
30:   память локальный гипотеза
31:
32:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
33:
34:   присвоить гипотеза "r;<гипотеза>;[символ];[начало];[конец];[номер_правила]"    
35:   если (факт сопоставить $результат [гипотеза] )
36:   иначе
37:     факт добавить [гипотеза]
38:     присвоить ПРАВИЛО_ПРИМЕНЕНО да
39:     когда [ОТЛАДКА] печать "ДОБАВЛЕНО: [гипотеза]"
40:   конец
41: возврат
42:
43: функция Грамматический_разбор
44:   память локальный номер_факта успех \
45:     текущее_слово текущее_слово_позиция1 текущее_слово_позиция2 э3 э5 номер_итерации
46:
47:     * цикл, пока было примененно правило
48:   присвоить ПРАВИЛО_ПРИМЕНЕНО да номер_итерации 0
49:   пока [ПРАВИЛО_ПРИМЕНЕНО]
50:     присвоить ПРАВИЛО_ПРИМЕНЕНО ''
51:
52:     увеличить номер_итерации
53:     когда [ОТЛАДКА] печать '' "Итерация N:[номер_итерации]"
54:
55:         * цикл по всем терминальным и нетерминальным символам гипотез
56:     данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
57:     присвоить номер_факта 1 количество_фактов [$КоличествоФактов]
58:     пока [номер_факта] <= [количество_фактов]
59:       список сопоставить успех (факт взять $результат [номер_факта] ) "r;<гипотеза>;[?текущее_слово];[?текущее_слово_позиция1];[?текущее_слово_позиция2];[?]"
60:       если [успех]
61:                 * попытка применения всех правил к текущему символу
62:         данные использовать [ОБЛАСТЬ_ПРАВИЛА]
63:         для (факт сопоставить $результат "r;<правило>;[?];[текущее_слово];[?]" )
64:           список сопоставить успех (факт взять $результат [$ОбъектЦикла] ) "r;<правило>;[?э3];[текущее_слово];[?э5]"
65:           если [успех]
66:             Применить_правило [текущее_слово] [текущее_слово_позиция1] [текущее_слово_позиция2] [$ОбъектЦикла] [э3] [э5]
67:           конец        
68:           данные использовать [ОБЛАСТЬ_ПРАВИЛА]
69:         следующий
70:       конец
71:       увеличить номер_факта
72:       данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
73:     цикл
74:   цикл
75: возврат
76:
77: функция Обработка_слова слово_исходное номер_слова
78:   память локальный слово морфология
79:   память локальный слово_свойства слово_категории слово_база слово_часть_речи
80:
81:   присвоить слово_свойства {} слово_категории {}
82:   строка строчные слово [слово_исходное]
83:   
84:   присвоить "ПРЕДЛ;[номер_слова];слово"     [слово_исходное] \
85:             "ПРЕДЛ;[номер_слова];слово_нр"  [слово] \
86:             "ПРЕДЛ;[номер_слова];слово_вр"  (строка прописные $результат [слово_исходное]) \
87:             "ПРЕДЛ;[номер_слова];регистр"   '' \
88:             "ПРЕДЛ;[номер_слова];класс"     '' \
89:             "ПРЕДЛ;[номер_слова];свойства"  {} \
90:             "ПРЕДЛ;[номер_слова];базы"      {} \
91:             "ПРЕДЛ;[номер_слова];категории" {}
92:
93:     *** 0) Определение регистра слова
94:   если [ПРЕДЛ;[номер_слова];слово] == [ПРЕДЛ;[номер_слова];слово_нр]
95:     присвоить "ПРЕДЛ;[номер_слова];регистр" нижний
96:   иначе
97:     если [ПРЕДЛ;[номер_слова];слово] == [ПРЕДЛ;[номер_слова];слово_вр]
98:       присвоить "ПРЕДЛ;[номер_слова];регистр" верхний
99:     иначе
100:       если (строка размер $результат [слово] ) > 1
101:         если (строка взять $результат [ПРЕДЛ;[номер_слова];слово] 1 ) == (строка взять $результат [ПРЕДЛ;[номер_слова];слово_вр] 1 )
102:           если (строка удалить $результат [ПРЕДЛ;[номер_слова];слово] 1 1 ) == (строка удалить $результат [ПРЕДЛ;[номер_слова];слово_нр] 1 1 )
103:             присвоить "ПРЕДЛ;[номер_слова];регистр" имя_собственное            
104:           конец
105:         конец
106:       конец
107:     конец
108:   конец
109:
110:     *** 1) Слова из 1 буквы
111:   если (строка размер $результат [слово] ) = 1
112:     выбрать [слово_исходное]
113:     вариант А;Б;В;Г;Д;Е;Ж;З;И;Й;К;Л;М;Н;О;П;Р;С;Т;У;Ф;Х;Ц;Ч;Ш;Щ;Э;Ю;Я
114:             * !!! Здесь используется $СписокЦикла из вызывающей функции !!!
115:       если (список голова $результат [$СписокЦикла] ) == .
116:         присвоить слово_свойства "{[слово_исходное];ИНИЦИАЛ}" "ПРЕДЛ;[номер_слова];класс" ИНИЦИАЛ
117:       конец
118:     вариант '.;,;?;!;+;-;*;/;\;=;>;<;(;);:;";%;$;@'
119:       присвоить слово_свойства "{[слово_исходное];ЗНАК_ПРЕПИНАНИЯ}" "ПРЕДЛ;[номер_слова];класс" ЗНАК_ПРЕПИНАНИЯ
120:     вариант "'"
121:       присвоить слово_свойства "{[слово_исходное];ЗНАК_ПРЕПИНАНИЯ}" "ПРЕДЛ;[номер_слова];класс" ЗНАК_ПРЕПИНАНИЯ
122:     конецВыбора
123:   конец
124:
125:   если [ПРЕДЛ;[номер_слова];класс] == ''
126:     *** 2) Проверка на число
127:     если (вычислить являетсяЧислом $результат [слово] )    
128:       присвоить слово_свойства "{[слово];ЧИСЛО}" "ПРЕДЛ;[номер_слова];класс" ЧИСЛО
129:     иначе
130:             *** 3) Проверка по морфологическому словарю
131:       данные использовать [ОБЛАСТЬ_СЛОВА]
132:       понятие над морфология [слово]
133:       если [морфология]
134:         присвоить слово_свойства [морфология] "ПРЕДЛ;[номер_слова];класс" СЛОВО
135:       иначе
136:         присвоить слово_свойства [слово] "ПРЕДЛ;[номер_слова];класс" СЛОВО
137:       конец
138:     конец
139:   конец
140:
141:     *** 6) Определение категорий слова
142:   если [ПРЕДЛ;[номер_слова];класс] == СЛОВО
143:     данные использовать [ОБЛАСТЬ_КАТЕГОРИИ]
144:     для [слово_свойства]
145:       присвоить слово_база [$ОбъектЦикла]
146:       понятие над слово_категории [слово_база]
147:        
148:       список сцепить "ПРЕДЛ;[номер_слова];свойства" $ "{[$ОбъектЦикла];[слово_категории]}"
149:       множество или "ПРЕДЛ;[номер_слова];базы" $ [слово_база]
150:       множество или "ПРЕДЛ;[номер_слова];категории" $ [слово_категории]
151:     следующий
152:   конец
153: возврат
154:
155: функция Обработка_предложения предложение
156:   память очистить ПРЕДЛ
157:   присвоить ПРЕДЛ;исходное [предложение] ПРЕДЛ;базы {} ПРЕДЛ;категории {}
158:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
159:   данные новый
160:
161:   строка кСпискуСлов ПРЕДЛ;список [ПРЕДЛ;исходное]
162:   список размер ПРЕДЛ;количество_слов [ПРЕДЛ;список]
163:   для [ПРЕДЛ;список]
164:     Обработка_слова [$ОбъектЦикла] [$НомерИтерации]
165:   следующий
166:
167:   Формирование_начальных_гипотез
168:   Грамматический_разбор
169:
170:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
171:   когда [ОТЛАДКА] показать данные
172: возврат
173:
174: функция Формирование_начальных_гипотез
175: память локальный номер_слова
176:
177:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
178:   для номер_слова (список сгенерить $результат 1 [ПРЕДЛ;количество_слов] )
179:     если [ПРЕДЛ;[номер_слова];базы] == {}
180:       если [ПРЕДЛ;[номер_слова];класс] == ЧИСЛО
181:         факт добавить "r;<гипотеза>;ЧИСЛО;[номер_слова];[номер_слова];0"
182:       иначе
183:         факт добавить "r;<гипотеза>;[ПРЕДЛ;[номер_слова];слово_нр];[номер_слова];[номер_слова];0"
184:       конец
185:     иначе
186:       для [ПРЕДЛ;[номер_слова];базы]
187:         факт добавить "r;<гипотеза>;[$ОбъектЦикла];[номер_слова];[номер_слова];0"
188:       следующий
189:       для [ПРЕДЛ;[номер_слова];категории]
190:         факт добавить "r;<гипотеза>;[$ОбъектЦикла];[номер_слова];[номер_слова];0"
191:       следующий
192:     конец
193:   следующий
194: возврат
195:
196:
197: *********************************************
198: ******      Начало основного кода      ******
199: *********************************************
200:
201:
202: присвоить ОТЛАДКА 0 ОБУЧЕНИЕ 0
203:
204: присвоить ОБЛАСТЬ_КАТЕГОРИИ 2 ОБЛАСТЬ_ПРАВИЛА 3 ОБЛАСТЬ_ГИПОТЕЗЫ 4 ОБЛАСТЬ_СЛОВА 5  
205:
206: присвоить ФАЙЛ_КАТЕГОРИИ "cat.txt"  
207: присвоить ФАЙЛ_ПРАВИЛА   "rule.txt"
208: присвоить ФАЙЛ_СЛОВА     "word.txt"
209: присвоить ФАЙЛ_ВРЕМЕННЫЙ "tmp.tmp"
210:
211: Загрузить_данные [ОБЛАСТЬ_КАТЕГОРИИ] [ФАЙЛ_КАТЕГОРИИ]
212: Загрузить_данные [ОБЛАСТЬ_ПРАВИЛА] [ФАЙЛ_ПРАВИЛА]
213: Загрузить_данные [ОБЛАСТЬ_СЛОВА] [ФАЙЛ_СЛОВА]
214:
215: *** Графика
216:
217: присвоить _ПИ_ 3,141592653589
218: присвоить ОБЛАСТЬ_РИСУНОК 5
219: присвоить ЦЕНТР_Х 300 ЦЕНТР_У 300
220: присвоить ПОЛОЖЕНИЕ_Х [ЦЕНТР_Х] ПОЛОЖЕНИЕ_У [ЦЕНТР_У]
221: присвоить РАЗМЕР_Х 200 РАЗМЕР_У [РАЗМЕР_Х]  
222: присвоить КУРСОР_ШАГ_Х [РАЗМЕР_Х] КУРСОР_ШАГ_У [РАЗМЕР_У]
223: вычислить / СДВИГ [РАЗМЕР_Х] 4
224: присвоить МАСШТАБ_ДЛЯ_БОЛЬШОЙ 2  
225: вычислить / МАСШТАБ_ДЛЯ_МАЛЫЙ 1 [МАСШТАБ_ДЛЯ_БОЛЬШОЙ]
226: присвоить РАЗМЕР_КУРСОРА 30
227: присвоить КОМАНДА_КОНТЕКСТ '' ФИГУРЫ_КОНТЕКСТ {}
228: присвоить ФАЙЛ_С_РИСУНКОМ "[$ТекущийКаталог]Рисунок1.txt"
229:
230: присвоить предложение 'нарисуй большой синий круг' предложения [предложение]
231: Рисовать_курсор
232: пока [предложение]
233:   ввести переменная предложение 'Введите предложение:' (список сцепить $результат '' [предложения] )
234:   строка отсечьПробелы предложение $
235:   если [предложение]
236:     строка коды предложение $ "?;{}_'"
237:     список сцепить предложения [предложение] [предложения]
238:     Обработка_предложения [предложение]
239:     Интерпретация_предложения
240:     Перерисовать_рисунок
241:   конец
242: цикл
243:
244: *** Сохранение данных
245:
246: если [ОБУЧЕНИЕ]
247:   если [ДАННЫЕ_ИЗ_ИНТЕРНЕТ]
248:     * Если загрузка из Интернет, то данные не сохраняем
249:   иначе
250:     данные использовать [ОБЛАСТЬ_КАТЕГОРИИ]
251:     если [$данныеИзменены]
252:       данные сохранить "[$ТекущийКаталог][ФАЙЛ_КАТЕГОРИИ]"
253:     конец
254:   конец
255: конец
256:
257: ****** Интерпретация предложения и рисование *****
258:
259: функция Интерпретация_предложения
260: память локальный команда
261:
262:   память очистить ФРЕЙМ
263:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
264:   факт сопоставитьМножество команда "r;<гипотеза>;[?рез];[?];[?];[?]"
265:   множество и команда $ РИСОВАТЬ_ФИГУРУ;ПЕРЕМЕСТИТЬ_КУРСОР;ПОВТОРИТЬ;ИЗМЕНИТЬ_ЦВЕТ;ИЗМЕНИТЬ_РАЗМЕР;ИЗМЕНИТЬ_ПОЛОЖЕНИЕ;ПОВЕРНУТЬ_ФИГУРУ;ПОВЕРНУТЬ_ФИГУРУ_ПО_ЧАСОВОЙ;ПОВЕРНУТЬ_ФИГУРУ_ПРОТИВ_ЧАСОВОЙ;ИЗМЕНИТЬ_ТОЧНОСТЬ;НОВЫЙ_РИСУНОК;ЗАПОМНИТЬ_РИСУНОК;ВСПОМНИТЬ_РИСУНОК;УДАЛИТЬ_ФИГУРУ
266:   если (список размер $результат [команда] ) = 1  
267:     если [команда] == ПОВТОРИТЬ
268:       присвоить команда [КОМАНДА_КОНТЕКСТ]
269:     иначе
270:       присвоить КОМАНДА_КОНТЕКСТ [команда]
271:     конец
272:     присвоить ФРЕЙМ;команда [команда]
273:     Выполнить_команду
274:   иначе
275:     показать сообщение "Простите, не могу :("
276:     данные показать
277:   конец
278: возврат
279:
280: функция Выполнить_команду
281:   память локальный новый_х новый_у
282:
283:   выбрать [ФРЕЙМ;команда]
284:   вариант РИСОВАТЬ_ФИГУРУ
285:     Определить_свойство фигура _фигура ''
286:     Определить_свойство цвет _цвет черный
287:     Определить_свойство размер _размер обычный
288:     Определить_свойство количество _количество один
289:     Рассчитать_фигуру
290:     Рисовать_фигуру
291:   вариант ПЕРЕМЕСТИТЬ_КУРСОР
292:     Определить_свойство направление _направление ''
293:     Переместить_курсор
294:   вариант ИЗМЕНИТЬ_ЦВЕТ
295:     для [ФИГУРЫ_КОНТЕКСТ]
296:       Взять_фигуру [$ОбъектЦикла]
297:       Определить_свойство цвет _цвет черный
298:       Цвет_в_число
299:       Изменить_фигуру [$ОбъектЦикла]
300:     следующий
301:   вариант ИЗМЕНИТЬ_РАЗМЕР
302:     для [ФИГУРЫ_КОНТЕКСТ]
303:       Взять_фигуру [$ОбъектЦикла]
304:       Определить_свойство размер _размер обычный
305:       если [ФРЕЙМ;размер] == обычный
306:         Определить_свойство размер _изменять_размер обычный
307:       конец
308:       Масштаб_в_число
309:       Изменить_масштаб [ФРЕЙМ;масштаб_число]
310:       Изменить_фигуру [$ОбъектЦикла]
311:     следующий
312:   вариант ИЗМЕНИТЬ_ПОЛОЖЕНИЕ
313:     для [ФИГУРЫ_КОНТЕКСТ]
314:       Взять_фигуру [$ОбъектЦикла]
315:       Определить_свойство направление _направление ''
316:       выбрать [ФРЕЙМ;направление]
317:       вариант вправо  
318:         Сдвиг_координат [КУРСОР_ШАГ_Х] 0
319:       вариант влево
320:         Сдвиг_координат "-[КУРСОР_ШАГ_Х]" 0
321:       вариант вверх
322:         Сдвиг_координат 0 "-[КУРСОР_ШАГ_У]"
323:       вариант вниз
324:         Сдвиг_координат 0 [КУРСОР_ШАГ_У]
325:       вариант центр
326:                 * Не ясно, как делать???
327:       конецВыбора          
328:       Изменить_фигуру [$ОбъектЦикла]
329:     следующий
330:   вариант ПОВЕРНУТЬ_ФИГУРУ;ПОВЕРНУТЬ_ФИГУРУ_ПО_ЧАСОВОЙ
331:     для [ФИГУРЫ_КОНТЕКСТ]
332:       Взять_фигуру [$ОбъектЦикла]
333:       если [ФРЕЙМ;фигура] != круг
334:         Повернуть_фигуру 45
335:       конец
336:       Изменить_фигуру [$ОбъектЦикла]
337:     следующий
338:   вариант ПОВЕРНУТЬ_ФИГУРУ_ПРОТИВ_ЧАСОВОЙ
339:     для [ФИГУРЫ_КОНТЕКСТ]
340:       Взять_фигуру [$ОбъектЦикла]
341:       если [ФРЕЙМ;фигура] != круг
342:         Повернуть_фигуру -45
343:       конец
344:       Изменить_фигуру [$ОбъектЦикла]
345:     следующий
346:   вариант ИЗМЕНИТЬ_ТОЧНОСТЬ
347:     Определить_свойство точность _точность обычный
348:     Точность_в_число
349:     вычислить * КУРСОР_ШАГ_Х $ [ФРЕЙМ;точность_число]
350:     вычислить * КУРСОР_ШАГ_У $ [ФРЕЙМ;точность_число]
351:   вариант НОВЫЙ_РИСУНОК
352:     данные использовать [ОБЛАСТЬ_РИСУНОК]
353:     данные новый
354:   вариант ЗАПОМНИТЬ_РИСУНОК
355:     данные использовать [ОБЛАСТЬ_РИСУНОК]
356:     данные сохранить [ФАЙЛ_С_РИСУНКОМ]
357:   вариант ВСПОМНИТЬ_РИСУНОК
358:     если (файл существует $результат [ФАЙЛ_С_РИСУНКОМ] )  
359:       данные использовать [ОБЛАСТЬ_РИСУНОК]
360:       данные загрузить [ФАЙЛ_С_РИСУНКОМ]
361:     иначе
362:       показать сообщение "Файл с рисунком '[ФАЙЛ_С_РИСУНКОМ]' не найден."
363:     конец
364:   вариант УДАЛИТЬ_ФИГУРУ
365:     для [ФИГУРЫ_КОНТЕКСТ]
366:       Взять_фигуру [$ОбъектЦикла]
367:       Удалить_фигуру [$ОбъектЦикла]
368:     следующий
369:   конецВыбора
370: возврат
371:
372: функция Определить_свойство имя_свойства имя_категории значение_свойства_по_умолчанию
373: память локальный поз1 поз2
374:   данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ]
375:   если (факт сопоставитьСПервым $результат "r;<гипотеза>;[имя_категории];[?поз1];[?поз2];[?]" )
376:     присвоить "ФРЕЙМ;[имя_свойства]" (список голова $результат [ПРЕДЛ;[поз1];базы] )
377:   иначе
378:     присвоить "ФРЕЙМ;[имя_свойства][значение_свойства_по_умолчанию]
379:   конец  
380: возврат
381:
382: функция Масштаб_в_число
383:   присвоить ФРЕЙМ;масштаб_число (список отобразить $результат [ФРЕЙМ;размер] обычный;большой;больше;больший;малый;маленький;маленькая;уменьшить;увеличить "1;[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ]" 1 )
384: возврат
385:
386: функция Цвет_в_число
387:   присвоить ФРЕЙМ;цвет_число (список отобразить $результат [ФРЕЙМ;цвет] белый;черный;красный;красное;желтый;зеленый;синий 16;1;10;10;12;11;13 1 )
388: возврат
389:
390: функция Количество_в_число
391:   присвоить ФРЕЙМ;количество_число (список отобразить $результат [ФРЕЙМ;количество] один;два;три;тереть;четыре;пять 1;2;3;3;4;5 1 )
392: возврат
393:
394: функция Точность_в_число
395:   присвоить ФРЕЙМ;точность_число (список отобразить $результат [ФРЕЙМ;точность] обычный;точный;грубый "1;0,5;2" 1 )
396: возврат
397:
398: функция Рассчитать_фигуру
399: память локальный номер_фигуры х1 у1 х2 у2 х3 у3 х4 у4 х5 у5
400:
401: * Масштаб фигуры
402:   присвоить ФРЕЙМ;размер_х [РАЗМЕР_Х] ФРЕЙМ;размер_у [РАЗМЕР_У] ФРЕЙМ;сдвиг [СДВИГ]
403:   присвоить ФРЕЙМ;еще_точки {}
404:   Масштаб_в_число
405:   если [ФРЕЙМ;масштаб_число] <> 1
406:     вычислить * ФРЕЙМ;размер_х $ [ФРЕЙМ;масштаб_число]  
407:     вычислить * ФРЕЙМ;размер_у $ [ФРЕЙМ;масштаб_число]  
408:     вычислить * ФРЕЙМ;сдвиг $ [ФРЕЙМ;масштаб_число]  
409:   конец
410:
411: * Координаты фигуры
412:   вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
413:   вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 )
414:   вычислить + х2 [х1] [ФРЕЙМ;размер_х] -1  
415:   вычислить + у2 [у1] [ФРЕЙМ;размер_у] -1
416:  
417:   выбрать [ФРЕЙМ;фигура]
418:   вариант линия;круг
419:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2]"
420:   вариант квадрат
421:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у1];[х2]:[у2];[х1]:[у2]"
422:   вариант прямоугольник
423:     увеличить х2 [ФРЕЙМ;размер_х]
424:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у1];[х2]:[у2];[х1]:[у2]"
425:   вариант треугольник
426:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х2]:[у1]"
427:   вариант трапеция
428:     вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 )
429:     вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 )
430:     вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 )
431:     присвоить у2 [у1]
432:     вычислить + х3 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
433:     вычислить + у3 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 )
434:     вычислить - х4 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
435:     присвоить у4 [у3]
436:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х3]:[у3];[х4]:[у4]"
437:   вариант многоугольник
438:     вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 )
439:     вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 )
440:     вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 )
441:     присвоить у2 [у1]
442:     вычислить + х3 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
443:     присвоить у3 [ПОЛОЖЕНИЕ_У]
444:     присвоить х4 [ПОЛОЖЕНИЕ_Х]
445:     вычислить + у4 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 )
446:     вычислить - х5 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
447:     присвоить у5 [у3]
448:     присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х3]:[у3];[х4]:[у4];[х5]:[у5]"
449:   вариант ромб
450:     вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 4 )
451:     вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
452:     вычислить + у3 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 4 )
453:     вычислить - х4 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 )
454:     присвоить ФРЕЙМ;еще_точки "[ПОЛОЖЕНИЕ_Х]:[у1];[х2]:[ПОЛОЖЕНИЕ_У];[ПОЛОЖЕНИЕ_Х]:[у3];[х4]:[ПОЛОЖЕНИЕ_У]"  
455:   конецВыбора
456:
457:   Цвет_в_число
458:   Количество_в_число
459: возврат    
460:
461: *** Преобразование координат фигуры
462:
463: функция Центр_фигуры
464: память локальный успешно х у х_мин у_мин х_макс у_макс
465:   для [ФРЕЙМ;еще_точки]
466:     строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]"
467:     если [$НомерИтерации] = 1
468:       присвоить х_мин [х] у_мин [у] х_макс [х] у_макс [у]
469:     иначе
470:       если [х_мин] > [х]    
471:         присвоить х_мин [х]
472:       конец
473:       если [х_макс] < [х]    
474:         присвоить х_макс [х]
475:       конец
476:       если [у_мин] > [у]    
477:         присвоить у_мин [у]
478:       конец
479:       если [у_макс] < [у]    
480:         присвоить у_макс [у]
481:       конец
482:     конец
483:   следующий
484:
485:   вычислить / ФРЕЙМ;центр_х (вычислить + $результат [х_макс] [х_мин] ) 2
486:   вычислить / ФРЕЙМ;центр_у (вычислить + $результат [у_макс] [у_мин] ) 2
487: возврат
488:
489: функция Сдвиг_координат по_горизонтали по_вертикали
490: память локальный успешно еще_точки х у
491:   присвоить еще_точки {}    
492:   для [ФРЕЙМ;еще_точки]
493:     строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]"
494:     вычислить + х $ [по_горизонтали]
495:     вычислить + у $ [по_вертикали]
496:     список сцепить еще_точки $ "[х]:[у]"
497:   следующий
498:   присвоить ФРЕЙМ;еще_точки [еще_точки]
499: возврат
500:
501: функция Изменить_масштаб масштаб
502: память локальный успешно еще_точки х у
503:   Центр_фигуры
504:   присвоить еще_точки {}    
505:   для [ФРЕЙМ;еще_точки]
506:     строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]"
507:     вычислить + х [ФРЕЙМ;центр_х] (вычислить * $результат (вычислить - $результат [х] [ФРЕЙМ;центр_х] ) [масштаб] )
508:     вычислить + у [ФРЕЙМ;центр_у] (вычислить * $результат (вычислить - $результат [у] [ФРЕЙМ;центр_у] ) [масштаб] )
509:     список сцепить еще_точки $ "[х]:[у]"
510:   следующий
511:   присвоить ФРЕЙМ;еще_точки [еще_точки]
512: возврат
513:  
514: функция Повернуть_фигуру градусы
515: память локальный успешно еще_точки х у х1 у1 кос син _УГОЛ_РАДИАНЫ_
516:
517:   вычислить * _УГОЛ_РАДИАНЫ_ (вычислить / $результат [градусы] 180 ) [_ПИ_]  
518:   вычислить косинус кос [_УГОЛ_РАДИАНЫ_]
519:   вычислить синус   син [_УГОЛ_РАДИАНЫ_]
520:
521:   Центр_фигуры
522:   присвоить еще_точки {}    
523:   для [ФРЕЙМ;еще_точки]
524:     строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]"
525:
526:     вычислить - х $ [ФРЕЙМ;центр_х]
527:     вычислить - у $ [ФРЕЙМ;центр_у]
528:     вычислить - х1 (вычислить * $результат [х] [кос] ) (вычислить * $результат [у] [син] )
529:     вычислить + у1 (вычислить * $результат [х] [син] ) (вычислить * $результат [у] [кос] )
530:     вычислить + х [ФРЕЙМ;центр_х] [х1]
531:     вычислить + у [ФРЕЙМ;центр_у] [у1]
532:
533:     список сцепить еще_точки $ "[х]:[у]"
534:   следующий
535:   присвоить ФРЕЙМ;еще_точки [еще_точки]
536: возврат
537:
538: функция Рисовать_фигуру
539:   присвоить ФИГУРЫ_КОНТЕКСТ {}
540:   данные использовать [ОБЛАСТЬ_РИСУНОК]
541:   для (список сгенерить $результат 1 [ФРЕЙМ;количество_число] )
542:     понятие автономер номер_фигуры <автономер> <номер_фигуры>  
543:     факт добавить "r;<фигура>;[номер_фигуры];[ФРЕЙМ;фигура];[ФРЕЙМ;цвет_число];{[ФРЕЙМ;еще_точки]}"  
544:     список сцепить ФИГУРЫ_КОНТЕКСТ $ [номер_фигуры]
545:     Сдвиг_координат (вычислить + $результат [ФРЕЙМ;размер_х] [ФРЕЙМ;сдвиг] ) 0
546:   следующий
547: возврат
548:
549: функция Взять_фигуру номер_фигуры
550:   память локальный номер_факта
551:   данные использовать [ОБЛАСТЬ_РИСУНОК]
552:   факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?ФРЕЙМ;фигура];[?ФРЕЙМ;цвет_число];[?ФРЕЙМ;еще_точки]"  
553: возврат
554:
555: функция Изменить_фигуру номер_фигуры
556:   память локальный номер_факта
557:   данные использовать [ОБЛАСТЬ_РИСУНОК]
558:   факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?];[?];[?]"  
559:   факт присвоить [номер_факта] "r;<фигура>;[номер_фигуры];[ФРЕЙМ;фигура];[ФРЕЙМ;цвет_число];{[ФРЕЙМ;еще_точки]}"  
560: возврат
561:
562: функция Удалить_фигуру номер_фигуры
563:   память локальный номер_факта
564:   данные использовать [ОБЛАСТЬ_РИСУНОК]
565:   факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?];[?];[?]"  
566:   факт удалитьПоНомеру [номер_факта]
567: возврат
568:
569:
570: *** Курсор
571:
572: функция Переместить_курсор
573:   выбрать [ФРЕЙМ;направление]
574:   вариант вправо  
575:     увеличить ПОЛОЖЕНИЕ_Х [КУРСОР_ШАГ_Х]
576:   вариант влево
577:     увеличить ПОЛОЖЕНИЕ_Х "-[КУРСОР_ШАГ_Х]"
578:   вариант вверх
579:     увеличить ПОЛОЖЕНИЕ_У "-[КУРСОР_ШАГ_У]"
580:   вариант вниз
581:     увеличить ПОЛОЖЕНИЕ_У [КУРСОР_ШАГ_У]
582:   вариант центр
583:     присвоить ПОЛОЖЕНИЕ_Х [ЦЕНТР_Х] ПОЛОЖЕНИЕ_У [ЦЕНТР_У]
584:   конецВыбора  
585: возврат
586:
587: функция Рисовать_курсор
588:   присвоить $ТолщинаЛинии 3 $ЦветЛинии 1
589:
590:   рисовать линия (вычислить - $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \
591:     [ПОЛОЖЕНИЕ_У] \
592:     (вычислить + $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \
593:     [ПОЛОЖЕНИЕ_У]  
594:   рисовать линия [ПОЛОЖЕНИЕ_Х] \
595:     (вычислить - $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) \
596:     [ПОЛОЖЕНИЕ_Х] \
597:     (вычислить + $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] )
598:
599:   присвоить $ЦветЛинии 16
600:   рисовать линия (вычислить - $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \
601:     (вычислить + $результат [ПОЛОЖЕНИЕ_У] 3 ) \
602:     (вычислить + $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \
603:     (вычислить + $результат [ПОЛОЖЕНИЕ_У] 3 )
604:   рисовать линия (вычислить + $результат [ПОЛОЖЕНИЕ_Х] 3 ) \
605:     (вычислить - $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) \
606:     (вычислить + $результат [ПОЛОЖЕНИЕ_Х] 3 ) \
607:     (вычислить + $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] )
608: возврат
609:
610: *** Перерисовка всего рисунка
611:
612: функция Перерисовать_рисунок
613: память локальный номер_факта фигура цвет_число х1 у1 х2 у2 х3 у3 х4 у4 х5 у5 \
614:   успешно еще_точки
615:
616:   присвоить $ЦветКисти 16
617:   рисовать очистить
618:   данные использовать [ОБЛАСТЬ_РИСУНОК]
619:   когда [ОТЛАДКА] данные показать
620:   присвоить номер_факта 1
621:   пока [номер_факта] <= [$КоличествоФактов]
622:     если (список сопоставить $результат (факт взять $результат [номер_факта] ) "r;<фигура>;[?];[?фигура];[?цвет_число];[?еще_точки]" )
623:       присвоить $ЦветКисти [цвет_число] $ЦветЛинии [цвет_число]  
624:       присвоить $ТолщинаЛинии 1
625:
626:       строка сопоставить успешно (список взять $результат [еще_точки] 1 ) "[?х1];:;[?у1]"
627:       строка сопоставить успешно (список взять $результат [еще_точки] 2 ) "[?х2];:;[?у2]"
628:
629:       выбрать [фигура]
630:       вариант линия
631:         рисовать линия [х1] [у1] [х2] [у2]  
632:       вариант круг
633:         рисовать круг [х1] [у1] [х2] [у2]
634:       вариант треугольник  
635:         строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]"
636:         рисовать треугольник [х1] [у1] [х2] [у2] [х3] [у3]
637:       вариант квадрат;прямоугольник;трапеция;ромб  
638:         строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]"
639:         строка сопоставить успешно (список взять $результат [еще_точки] 4 ) "[?х4];:;[?у4]"
640:         рисовать многоугольник [х1] [у1] [х2] [у2] [х3] [у3] [х4] [у4]
641:       вариант многоугольник  
642:         строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]"
643:         строка сопоставить успешно (список взять $результат [еще_точки] 4 ) "[?х4];:;[?у4]"
644:         строка сопоставить успешно (список взять $результат [еще_точки] 5 ) "[?х5];:;[?у5]"
645:         рисовать многоугольник [х1] [у1] [х2] [у2] [х3] [у3] [х4] [у4] [х5] [у5]
646:       конецВыбора
647:     конец
648:     увеличить номер_факта
649:   цикл
650:   Рисовать_курсор
651: возврат
652:
653: функция Загрузить_данные область_данных имя_файла
654:   данные использовать [область_данных]
655:   если [ДАННЫЕ_ИЗ_ИНТЕРНЕТ]
656:     импорт webText "http://www.gendoc.ru/Examples/[имя_файла]" "[$ТекущийКаталог][ФАЙЛ_ВРЕМЕННЫЙ]"
657:     данные загрузить "[$ТекущийКаталог][ФАЙЛ_ВРЕМЕННЫЙ]"
658:     >База фактов '[имя_файла]' загружена с www.gendoc.ru.
659:   иначе
660:     данные загрузить "[$ТекущийКаталог][имя_файла]"
661:   конец
662: возврат
663: